#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/ioport.h>

// 平台设备探测函数
// 当系统检测到一个平台设备与该驱动程序匹配时，该 函数将被调用以初始化和配置设备。  
int my_platform_probe(struct platform_device *pdev)
{
    struct resource *res_mem;
    struct resource *res_irq;

    printk(KERN_EMERG "my_platform_probe: Probing platform device!\n");
    /* 设备特定操作 */

    // 方法1直接访问 platform_device *pdev
    if (pdev->num_resources >= 2)
    {
        // 局部变量
        struct resource *res_mem = &pdev->resource[0];
        struct resource *res_irq = &pdev->resource[1];

        printk(KERN_EMERG "Method 1: MEM [0x%llx --- 0x%llx]\n", res_mem->start, res_mem->end);
        printk(KERN_EMERG "Method 1: IRQ [%lld]\n", res_irq->start);
    }

    // 方法2, 通过platform_get_resource()函数获取
    res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    if (!res_mem)
    {
        dev_err(&pdev->dev, "Failed to get memory resource\n");
        return -ENODEV;
    }
    res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
    if (!res_irq)
    {
        dev_err(&pdev->dev, "Failed to get IRQ resource\n");
        return -ENODEV;
    }
    printk(KERN_EMERG "Method 2: MEM [0x%llx --- 0x%llx]\n", res_mem->start, res_mem->end);
    printk(KERN_EMERG "Method 2: IRQ [%lld]\n", res_irq->start);

    return 0;
}

// 平台设备移除函数
// 当平台设备从系统中移除时，该函数将被调用以执行 清理和释放资源的操作。
int my_platform_remove(struct platform_device *pdev)
{
    printk(KERN_EMERG "my_platform_remove: Remove platform device!\n");
    /* 设备特定操作 */

    return 0;
}

// 平台设备关闭函数
// 当系统关闭时，该函数将被调用以执行与平台设备 相关的关闭操作。 
void my_platform_shutdown(struct platform_device *pdev)
{
    printk(KERN_EMERG "my_platform_shutdown: Shutdown platform device!\n");
    /* 设备特定操作 */

    
}
// 平台设备挂起函数
// 当系统进入挂起状态时，该函数将被调用以执行与 平台设备相关的挂起操作。
int my_platform_suspend(struct platform_device *pdev, pm_message_t state)
{
    printk(KERN_EMERG "my_platform_suspend: Suspend platform device!\n");
    /* 设备特定操作 */

    return 0;
}
// 平台设备恢复函数
// 当系统从挂起状态恢复时，该函数将被调用以执行与 平台设备相关的恢复操作。  
int my_platform_resume(struct platform_device *pdev)
{
    printk(KERN_EMERG "my_platform_resume: Resume platform device!\n");
    /* 设备特定操作 */

    return 0;
}



static struct platform_driver my_platform_driver = {
    .probe = my_platform_probe,
    .remove = my_platform_remove,
    .shutdown = my_platform_shutdown,
    .suspend = my_platform_suspend,
    .resume = my_platform_resume,

    .driver = {
        .name = "my_platform_device",
        .owner = THIS_MODULE,
    },
};


static int __init my_platform_device_init(void)
{   
    int ret;

    // 注册平台驱动
    ret = platform_driver_register(&my_platform_driver);
     if (ret < 0)
    {
        printk(KERN_EMERG "Failed platform_driver_register.\n");
        return ret;
    }

    printk(KERN_EMERG "platform_driver_register OK!\n");

    return 0;
}



static void __exit my_platform_device_exit(void)
{
    platform_driver_unregister(&my_platform_driver);
    printk(KERN_EMERG "platform_driver_unregister OK!\n");
}



module_init(my_platform_device_init);
module_exit(my_platform_device_exit);

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Treasure1029");










